package EnterpriseAlgorithm.Stack_Queue.Code.RealizeBetweenS_And_Q;

import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;

class MyStack_ii {

    Queue<Integer> queue1; // 和栈中保持一样元素的队列
    Queue<Integer> queue2; // 辅助队列

    /**
     * Initialize your data structure here.
     */
    public MyStack_ii() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    /**
     * 模拟入队
     */
    //在加入元素时先将q1中的元素依次出栈压入q2，然后将新加入的元素压入q1，再将q2中的元素依次出栈压入q1
    public void push(int x) {
        while (!queue1.isEmpty()) {
            queue2.add(queue1.poll());
        }
        queue1.add(x);
        while (!queue2.isEmpty()) {
            queue1.add(queue2.poll());
        }
    }

    /**
     * 模拟出栈
     */
    public int pop() {
        if (queue1.isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        } else {
            // 因为queue1中的元素和栈中的保持一致，所以这个和下面两个的操作只看queue1即可
            return queue1.poll();
        }
    }

    /**
     * 获取栈顶元素
     */
    public int top() {
        if (queue1.isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        } else {
            return queue1.peek();
        }
    }

    /**
     * 判断是否为空
     */
    public boolean empty() {
        return queue1.isEmpty();
    }
}